package com.qn.sms.core.client.impl;

import com.qn.sms.core.client.SmsClient;
import com.qn.sms.core.client.dto.SmsSendRespDTO;
import com.qn.sms.core.client.vo.SmsCommonResult;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 短信客户端的抽象类，提供模板方法，减少子类的冗余代码
 *
 * @author QN
 * @date 2022/02/26
 */
@Slf4j
public abstract class AbstractSmsClient implements SmsClient {

    /**
     * 初始化
     */
    public final void init() {
        doInit();
        log.info("[init] 初始化完成]");
    }

    /**
     * 自定义初始化
     */
    protected abstract void doInit();

    @Override
    public SmsCommonResult<SmsSendRespDTO> sendSms(String logId, String mobile, String apiTemplateId, Map<String, Object> templateParams) {
        // 执行短信发送
        SmsCommonResult<SmsSendRespDTO> result;
        try {
            result = doSendSms(logId, mobile, apiTemplateId, templateParams);
        } catch (Throwable ex) {
            // 打印异常日志
            log.error("[sendSms][发送短信异常，sendLogId({}) mobile({}) apiTemplateId({}) templateParams({})]",
                    logId, mobile, apiTemplateId, templateParams, ex);
            // 封装返回
            return SmsCommonResult.error(ex);
        }
        return result;
    }

    protected abstract SmsCommonResult<SmsSendRespDTO> doSendSms(String sendLogId,
                                                                 String mobile,
                                                                 String apiTemplateId,
                                                                 Map<String, Object> templateParams) throws Throwable;

}
